package Util;

import java.util.InputMismatchException;

/**
 * Classe de utilidade para a verificação dos mais variados tipos de dados
 *
 * @author Max
 */
public class AuthenticateData {

    /**
     * Autentica um nome
     *
     * @return true se o nome é válido, false se não
     */
    public static boolean authenticateNotEmpty(String s) {
        if ((s == null) | (s.isEmpty())) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Verifica se um texto é composto por números.
     *
     * @param text Texto a ser verificado.
     * @return True se texto é composto por números. False em caso contrário.
     */
    public static boolean isInteger(String text) {
        if ((text != null) && (text.matches("[0-9]+"))) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Verifica se um texto é composto por números formato dinheiro.
     *
     * @param text Texto a ser verificado.
     * @return True se texto é composto por números formato dinheiro. False em
     * caso contrário.
     */
    public static boolean isMoney(String text) {
        text = text.replaceAll(",", ".").replaceAll(".", "");
        for (int i = 0; i < text.length(); i++) {
            if (!Character.isDigit(text.charAt(i))) {
                return false;
            }
        }
        return true;
    }

    /**
     * Verifica se um texto é composto por letras.
     *
     * @param text Texto a ser verificado.
     * @return True se texto é composto por letras. False em caso contrário.
     */
    public static boolean isLetter(String text) {
        text = text.trim().replaceAll(" ", "");
        for (int i = 0; i < text.length(); i++) {
            if (!Character.isLetter(text.charAt(i))) {
                return false;
            }
        }

        return true;
    }

    /**
     * Verifica se um texto é composto por números ou letras.
     *
     * @param text Texto a ser verificado.
     * @return True se texto é composto por números ou letras. False em caso
     * contrário.
     */
    public static boolean isLetterOrNumber(String text) {
        for (int i = 0; i < text.length(); i++) {
            if (!Character.isLetterOrDigit(text.charAt(i))) {
                return false;
            }
        }
        return true;
    }

    /**
     * Valida se um CPF é válido.
     *
     * @param String CPF: numero a ser validado.
     * @return true se o o CPF informado é valido, false se não.
     */
    public static boolean isCPF(String CPF) {
        CPF = CPF.replace(".", "");
        CPF = CPF.replace("-", "");

        // considera-se erro CPF's formados por uma sequencia de numeros iguais
        if (CPF.equals("00000000000") || CPF.equals("11111111111")
                || CPF.equals("22222222222") || CPF.equals("33333333333")
                || CPF.equals("44444444444") || CPF.equals("55555555555")
                || CPF.equals("66666666666") || CPF.equals("77777777777")
                || CPF.equals("88888888888") || CPF.equals("99999999999")
                || (CPF.length() != 11)) {
            return (false);
        }

        char dig10, dig11;
        int sm, i, r, num, peso;

        try {
            // Calculo do 1o. Digito Verificador
            sm = 0;
            peso = 10;
            for (i = 0; i < 9; i++) {
                // converte o i-esimo caractere do CPF em um numero:
                // por exemplo, transforma o caractere '0' no inteiro 0
                // (48 eh a posicao de '0' na tabela ASCII)
                num = (int) (CPF.charAt(i) - 48);
                sm = sm + (num * peso);
                peso = peso - 1;
            }

            r = 11 - (sm % 11);
            if ((r == 10) || (r == 11)) {
                dig10 = '0';
            } else {
                // converte no respectivo caractere numerico
                dig10 = (char) (r + 48);
            }
            // Calculo do 2o. Digito Verificador
            sm = 0;
            peso = 11;
            for (i = 0; i < 10; i++) {
                num = (int) (CPF.charAt(i) - 48);
                sm = sm + (num * peso);
                peso = peso - 1;
            }

            r = 11 - (sm % 11);
            if ((r == 10) || (r == 11)) {
                dig11 = '0';
            } else {
                dig11 = (char) (r + 48);
            }

            // Verifica se os digitos calculados conferem com os digitos informados.
            if ((dig10 == CPF.charAt(9)) && (dig11 == CPF.charAt(10))) {
                return (true);
            } else {
                return (false);
            }
        } catch (InputMismatchException erro) {
            return (false);
        }
    }
}
